// 知识点1：在定义一个类时，我们可以显式或隐式的定义在此类型的对象拷贝、赋值、移动、销毁是做什么，主要通过五种特殊的成员函数来完成这些操作：拷贝构造函数、拷贝复制运算符、移动构造函数、移动复制运算符。析构函数

// 知识点2：拷贝和移动构造函数定义了当用同类型的一个对象初始化本对象时做什么。拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么。析构函数定义了当此类型对象销毁时的操作

// 知识点3：若一个类没有显式的定义这五个操作，编译器会自动为其定义缺失的操作，在定义一个类时，拷贝控制操作是非常的重要的

// 知识点4：拷贝构造函数：本身是一个构造函数，其参数是一个自身类类型的引用，且任何额外参数皆有默认值

// 知识点5：每个成员的类型决定了它的拷贝方式，对于类类型，将调用其拷贝构造函数进行拷贝，对于内置类型，则会直接拷贝，对于数组的拷贝是逐个元素的拷贝，若数组的元素是类类型，则使用拷贝构造函数来拷贝

// 知识点6：直接初始化：一对小括号加参数。拷贝初始化：等号右侧对象拷贝到正在创建的对象中，如果需要还需进行类型转换(拷贝初始化没有=号的情况：将一个对象作为实参传递给一个非引用类型的形参时、从一个返回类型非引用类型的函数返回一个对象、用花括号初始化列表初始化一个数组的元素或一个聚合类的成员)

// 知识点7：函数的调用中，非引用类型的参数都要进行拷贝初始化。非引用类型的返回值也会被用来初始化调用方的结果
// 见知识点